package edu.yonsei.iwb.smarttv.result;

import edu.yonsei.iwb.smarttv.model.measure.ResourceWeights;
import java.util.Enumeration;
import java.util.Vector;

/**
 * 사용자의 질의로부터 검색된 하나의 검색 결과를 저장하기 위한 클래스로써, 인스턴스에 대한 정보와 타입 정보, 그리고 분류체계에 대한 정보를 담고 있는 클래스
 * 
 * @author 이명진
 * @version 1.0, 2011.9.8
 */
public class SearchResultSet {    
    
    /**
     * 온톨로지 검색 결과 단일 인스턴스
     */
    private ResultNode result;
    /**
     * 인스턴스에 대한 타입 정보
     */
    private ResultTypeInfo type;
    /**
     * 인스턴스의 분류 체계
     */
    private ResultClassificationInfo classification;
    
    /**
     * 결과 resource의 가중치 합
     */
    private double score;
    
    public SearchResultSet(){        
        this.classification = new ResultClassificationInfo();        
    }

    public void setResult(ResultNode rn){
        this.result = rn;
    }

    public void setResultTypes(ResultTypeInfo rt){
        this.type = rt;
    }
    
    /**
     * 사용자의 질의로부터 검색된 인스턴스에 대한 정보를 반환하는 메소드
     *
     * @return 검색 결과 인스턴스의 URI와 Label을 저장하고 있는 ResultNode 객체를 반환
     */
    public ResultNode getResult() {
        return this.result;
    }

    /**
     * 사용자의 질의로부터 검색된 인스턴스에 대한 URI 정보를 반환하는 메소드
     *
     * @return 검색 결과 인스턴스의 URI를 반환
     */
    public String getResultId() {
        return this.result.getResultNodeId();
    }

    /**
     * 사용자의 질의로부터 검색된 인스턴스에 대한 Label 정보를 반환하는 메소드
     *
     * @return 검색 결과 인스턴스의 Label을 반환
     */
    public String getResultLabel() {
        return this.result.getLabel();
    }

    /**
     * 검색 결과 인스턴스의 type 정보를 반환하기 위한 메소드로써 예를 들어, (A rdf:type ?x)에 대해 ?x에 대한 정보를 반환하는 메소드
     *
     * @return 타입 정보를 저장하고 있는 ResultTypeInfo 객체를 반환
     */
    public ResultTypeInfo getResultTypes() {
        return this.type;
    }

    /**
     * 검색 결과 인스턴스가 가지고 있는 타입 정보의 개수를 반환하는 메소드
     *
     * @return 타입 정보의 개수를 반환
     */
    public int sizeOfResultType() {
        return this.type.size();
    }

    /**
     * 검색 결과 인스턴스가 가지고 있는 타입 정보 중 인덱스에 해당하는 타입 정보를 반환
     *
     * @param i 타입 정보를 얻기 위한 인덱스
     * @return i 번째 타입 정보를 ResultNode 객체로 반환
     */
    public ResultNode getResultType(int i) {
        return this.type.get(i);
    }
    
    
/**
     * 검색 결과 인스턴스에 대한 분류 체계를 입력하기 위한 메소드
     *
     * @return 분류 체계에 대한 정보를 담고 있는 ResultClassificationInfo 객체를 반환
     */
    public void setClassification(String key, ResultNode rn) {
        if(this.classification.containsKey(key)){
            this.classification.get(key).add(rn);      
        }else{
            Vector<ResultNode> v = new Vector<ResultNode>();
            v.add(rn);
            this.classification.put(key, v);                  
        }
        
    }
    
    /**
     * 검색 결과 인스턴스에 대한 분류 체계를 반환하기 위한 메소드
     *
     * @return 분류 체계에 대한 정보를 담고 있는 ResultClassificationInfo 객체를 반환
     */
    public ResultClassificationInfo getClassification() {
        return this.classification;
    }

    /**
     * 분류 체계에 대한 개수를 반환하는 메소드
     *
     * @return 분류 체계의 개수를 반환
     */
    public int sizeOfClassification() {
        return this.classification.size();
    }

    /**
     * 분류 체계의 기준으로 사용된 형태를 집합의 형태로 반환
     *
     * @return 사용된 분류 체계에 대해 Enumeration 형태로 반환
     */
    public Enumeration<String> getClassificationTypes() {
        return this.classification.keys();
    }

    /**
     * 검색 결과 인스턴스의 분류 체계 중 지정된 분류 체계에 대한 정보를 반환하는 메소드
     *
     * @param k 분류 체계
     * @return 해당 분류 체계에 대한 정보를 ResultNode 객체로 반환
     */
    public Vector<ResultNode> getClassificationByType(String k) {
        return this.classification.get(k);
    }
    
    public void setScore(double s){
        this.score = s;
    }
    
    public double getScore(){
        return this.score;
    }
    
    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append(this.result.toString());
        sb.append(this.type.toString());
        sb.append(this.classification.toString());
        sb.append("Search Result Score: ");
        sb.append(this.score);
        return sb.toString();
    }

}
